package com.scitc.utils;

import com.scitc.model.User;
import com.scitc.service.UserService;
import io.jsonwebtoken.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: zk
 * @date: 2021/6/25 17:32
 * @description: Jwt工具类
 */
@Component
public class JwtUtil {

    @Autowired
    private UserService userService;

    private final long EXPIRE_TIME = 24 * 60 * 60 * 1000; // 过期时间
    private final String KEY = "zglzgl"; // 加密密钥

    /**
     * 创建 token
     * @param user
     * @return token
     */
    public String createToken(User user){

        // 当前时间
        long nowTime = System.currentTimeMillis();

        // header
        Map<String, Object> header = new HashMap();
        header.put("typ", "JWT");
        header.put("alg", "HS256");

        // claims
        Map<String, Object> claims = new HashMap();
        claims.put("id", user.getId());
        claims.put("username", user.getUsername());
        claims.put("name", user.getName());

        JwtBuilder builder = Jwts.builder()
                .setHeader(header)
                .setClaims(claims)
                .setExpiration(new Date(nowTime + EXPIRE_TIME)) // 过期时间
                .setIssuedAt(new Date(nowTime)) // 创建时间
                .signWith(SignatureAlgorithm.HS256, KEY); // 加密
        return builder.compact();
    }

    /**
     * 解析 token
     * @param token
     * @return Claim
     */
    public Claims analysis(String token)  {
        Claims claims = null;
        try {
            //token过期后，会抛出ExpiredJwtException 异常，通过这个来判定token过期，
            claims = Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();
        } catch (ExpiredJwtException e) {
            return null;
        }
        return claims;
    }

    /**
     * 验证 token 是否有效
     * @param token
     * @return 2：令牌过期；1：令牌有效；0：令牌无效
     */
    public int verify(String token) {
        Claims claims = null;
        try {
            //token过期后，会抛出ExpiredJwtException 异常，通过这个来判定token过期，
            claims = Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();
        } catch (ExpiredJwtException e) {
            return 2;
        }
        //从token中获取用户id，查询该Id的用户是否存在，存在则token验证通过

        User user = userService.getUserById((String) claims.get("id"));
        if (user != null) {
            return 1;
        } else {
            return 0;
        }
    }

}